package org.batallademusica.dominio;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.lang.String;
import java.util.Iterator;
import java.util.List;

import javax.persistence.*;

import org.batallademusica.dao.EntityManagerFactorySingleton;
import org.batallademusica.dominio.Luchador;
import static javax.persistence.FetchType.EAGER;

/**
 * Entity implementation class for Entity: Lista
 *
 */
@Entity

public class Lista implements Serializable {

	@Id
	@GeneratedValue(strategy = IDENTITY)
	private long pk;
	private String nombre;
	@ManyToOne @JoinColumn(name="autor")
	private Luchador autor;
	@ManyToMany
	@OrderColumn(nullable = false, name = "prioridad")
	private List<Cancion> listaCanciones;
	private static final long serialVersionUID = 1L;
	
	public Lista(Luchador autor,String nombre) {
		this();
		this.nombre = nombre;
		this.autor = autor;
	}
	public Lista() {
		super();
	}   
	public long getPk() {
		return this.pk;
	}

	public void setPk(long pk) {
		this.pk = pk;
	}   
	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}   
	public Luchador getAutor() {
		return this.autor;
	}

	public void setAutor(Luchador autor) {
		this.autor = autor;
	}   
	public List<Cancion> getListaCanciones() {
		return this.listaCanciones;
	}

	public void setListaCanciones(List<Cancion> listaCanciones) {
		this.listaCanciones = listaCanciones;
	}
   
	public static Lista nuevaLista(Luchador luchador, String descripcion, List<Cancion> listaCanciones){
		Lista nuevaLista=new Lista(luchador,descripcion);
		nuevaLista.setListaCanciones(listaCanciones);
		EntityManager em=EntityManagerFactorySingleton.getInstance().getEntityManagerFactory().createEntityManager();
		em.getTransaction().begin();
		em.persist(nuevaLista);
		em.getTransaction().commit();
		em.close();
		return nuevaLista;
	}
	
	public static Lista nuevaLista(Luchador luchador, String descripcion){
		return nuevaLista(luchador,descripcion,null);
	}
	
	public Lista anadirCancion(Cancion cancion){
		this.listaCanciones.add(cancion);
		return this;
	}
	
	public Lista anadirCancion(Cancion cancion, int posicion){
		this.listaCanciones.add(posicion, cancion);
		return this;
	}
	
	public Lista moverCancion(Cancion cancion, int nuevaPosicion){
		int posicionActual;
		if(0>(posicionActual=this.listaCanciones.lastIndexOf(cancion)))
			this.moverCancion(posicionActual, nuevaPosicion);
		return this;
	}	
	
	public Lista moverCancion(int posicionActual, int nuevaPosicion){
		Lista puntero;
		EntityTransaction t=null;
		EntityManager em=EntityManagerFactorySingleton.getInstance().getEntityManagerFactory().createEntityManager();
		try{
			t=em.getTransaction();
			t.begin();
			try{
				puntero=em.merge(this);
				Cancion cancion=puntero.listaCanciones.remove(posicionActual);
				puntero.listaCanciones.add(nuevaPosicion, cancion);
				t.commit();
			}finally{
				if(t.isActive()) t.rollback();
			}
		}finally{
			em.close();
		}
		return this;
	}
}
